package com.yjz.designpattern.singletonpattern.enumSingleTon;

import java.io.Serializable;

/**
 * @author :yuanJinZhong
 * @description: 枚举实现单例的最佳实现（天生线程安全）
 * @date :2018/5/9-19:35
 */
public class EnumSingleton implements Serializable {

  private EnumSingleton() {
  }

  public static EnumSingleton getInstance() {
    return Singleton.INSTANCE.getInstance();
  }

  private static enum Singleton {//static 要不要无所谓
    INSTANCE;
    private EnumSingleton singleton;

    /**
     * JVM会保证此方法绝对只调用一次(枚举的构造方法是私有的，且枚举的构造方法只会加载一次)
     * <p>
     * 枚举实现单例的主要原理是：1）枚举类拥有业务对象的引用，
     * 2）然后在枚举的构造方法里面实例化这个引用，
     * 3）枚举里面再提供一个公开的方法抛出这个引用
     * 最根本的原因是枚举的构造函数是私有，且只会加载一次
     */
    Singleton() {
      singleton = new EnumSingleton();
    }

    public EnumSingleton getInstance() {
      return singleton;
    }
  }
}
